/** typescript实现栈 */
// TypeScript 没有内置的栈类，可以把Array类作为栈来使用
const stack: number[] = [];
/**
 * 元素入栈
 */
stack.push(1);
stack.push(2);
stack.push(3);
/**
 * 获取栈顶元素
 */
const peek = stack[stack.length - 1];
/**
 * 出栈
*/
const pop = stack.pop();
/**
 * 获取栈的大小
 */
const size = stack.length;
/**
 * 判断栈是否为空
 */
const isEmpty = stack.length === 0;

/**
 * 基于链表实现栈
 * --------代码为学习使用，开发中请使用英文---------
 */
import { ListNode } from "./链表";

class LinkedListStack {
  private stackPeek: ListNode | null; // 将头节点作为栈顶
  private stkSize: number = 0;//栈的长度
  constructor() {
    this.stackPeek = null;
  }
  /**获取栈的长度 */
  getSize(): number {//显示调用，也可以使用getter调用属性计算
    return this.stkSize;
  }
  /** 判断栈是否为空 */
  isEmpty(): boolean {
    // return this.stackPeek === null; //也可以这样判断
    return this.stkSize === 0;
  }
  /** 入栈 */
  push(val: number) {
    const newNode = new ListNode(val);
    newNode.next = this.stackPeek;
    this.stackPeek = newNode;
    this.stkSize++;
  }
  /** 出栈 */
  pop(): number {
    if (this.stackPeek === null) throw new Error("栈为空");
    const val = this.getPeek();
    this.stackPeek = this.stackPeek?.next ?? null;
    this.stkSize--;
    return val;
  }
  /** 获取栈顶元素 */
  getPeek(): number {
    if (this.stackPeek === null) throw new Error("栈为空");
    return this.stackPeek.val;
  }
  /** 转换数组输出 */
  toArray(): number[] {
    let node = this.stackPeek;
    const arr = new Array<number>(this.getSize());
    for (let i = arr.length - 1; i >= 0; i--) {
      arr[i] = node!.val; //非空断言操作符
      node = node!.next;
    }
    return arr;
  }
}

/**
 * 基于数组实现栈
 * 以数组的尾部作为栈顶
 */
class ArrayStack {
  private arr: number[];
  constructor() {
    this.arr = [];
  }
  /**获取栈的长度 */
  getSize(): number {
    return this.arr.length;
  }
  /** 判断栈是否为空 */
  isEmpty(): boolean {
    return this.arr.length === 0;
  }
  /** 入栈 */
  push(val: number) {
    this.arr.push(val);
  }
  /** 出栈 */
  pop(): number {
    if (this.arr.length === 0) throw new Error("栈为空");
    return this.arr.pop()!;
  }
  /** 获取栈顶元素 */
  getPeek(): number {
    if (this.arr.length === 0) throw new Error("栈为空");
    return this.arr[this.arr.length - 1];
  }
  /** 转换数组输出 */
  toArray(): number[] {
    return this.arr;
  }
}